package encrypt

import (
	"crypto/md5"
	"crypto/sha1"
	"crypto/sha256"
	"crypto/sha512"
	"encoding/hex"
	"fmt"
	"hash"
)

type HashType string

const (
	MD5    HashType = "md5"
	SHA1   HashType = "sha1"
	SHA256 HashType = "sha256"
	SHA512 HashType = "sha512"
)

// 根据不同哈希类型进行哈希：md4、md5、sha1、ripemd160、sha256、sha512
// text：待哈希的字符串
// hashType：哈希类型
// isHex：是否是十六进制字符串
func HASH(text string, hashType HashType, isHex bool) string {
	var hashInstance hash.Hash // 定义哈希实例
	switch hashType {          // 选择哈希类型
	case MD5:
		hashInstance = md5.New()
	case SHA1:
		hashInstance = sha1.New()
	case SHA256:
		hashInstance = sha256.New()
	case SHA512:
		hashInstance = sha512.New()
	}
	if isHex {
		arr, _ := hex.DecodeString(text) // 十六进制字符串转为十六进制字节数组
		hashInstance.Write(arr)          // 写入哈希实例对象
	} else {
		hashInstance.Write([]byte(text)) // 将字符串转换为字节数组，写入哈希对象
	}
	bytes := hashInstance.Sum(nil)  // 哈希值追加到参数后面，只获取原始值，不用追加，用nil，返回哈希值字节数组
	return fmt.Sprintf("%x", bytes) // 格式化输出哈希值
}
